/*
  1. 客户端向服务器发送请求，请求登录
    服务器判断用户名和密码是否正确，生成session对象，内部存储用户数据，为session对象生成session_id, 
    将session_id以cookie形式响应给客户端
  2. 客户端接受到服务器响应，接受cookie
    客户端会自动存储cookie
  3. 将来客户端发送请求，cookie会被自动携带上
    服务器通过解析cookie，得到session_id，在去找到对应session对象，从而得到用户数据，返回相应的响应
*/

import express from "express";
import cookieParser from "cookie-parser";

const app = express();

const users = [
  {
    id: 1,
    username: "admin",
    password: "111111",
    nickname: "管理员",
  },
];

app.use(express.json()); // 解析 application/json 格式数据
app.use(express.urlencoded({ extended: true })); // 解析 application/x-www-form-urlencoded 格式数据
app.use(cookieParser()); // 解析cookie数据，将cookie解析好放入req.cookies上

const sessions = {};

// 后端路由
// app[请求方式](请求地址, 处理请求的回调函数)
app.post("/login", (request, response, next) => {
  // 默认请求下，express不解析请求体参数的，需要使用中间件解析才行
  const { username, password } = request.body;

  const user = users.find(
    (user) => user.username === username && user.password === password
  );

  if (user) {
    // 登录成功
    // 生成session_id
    const sessionId = `${Math.random().toString().substring(2)}`;
    sessions[sessionId] = user;
    response.setHeader("set-cookie", `sessionId=${sessionId};httpOnly=true;`);

    response.json({
      code: 200,
      data: null,
    });
  } else {
    // 登录失败
    response.json({
      code: 201,
      message: "用户名或密码错误",
    });
  }
});

app.get("/info", (req, res) => {
  // 默认请求下，express不解析cookie参数的，需要使用中间件解析才行
  const { sessionId } = req.cookies;
  const user = sessions[sessionId];
  res.json({
    code: 200,
    data: {
      nickname: user.nickname,
    },
  });
});

app.listen(3000, (err) => {
  if (err) console.log(err);
  else console.log("服务器启动成功了~");
});
